export default class Store {
	constructor(parameters) {
		this._store = new Map(Object.entries(parameters));
		this.listenerList = new Map();
	}

	// 使用getter获取_store的值
	get store() {
		return Object.fromEntries(this._store);
	}

	// 使用setter更新store，调用set方法统一处理
	set store(obj) {
		this.set(obj);
	}

	// 获取指定键的值
	get(key) {
		return this._store.get(key);
	}

	// 检查是否存在指定键
	has(key) {
		return this._store.has(key);
	}

	// 删除指定键及其值
	delete(key) {
		this._store.delete(key);
	}

	// 设置键值对，支持单个或多个
	set(obj, val) {
		if (typeof obj === "string" && val !== undefined) {
			this.triggerListener(obj, val, this._store.get(obj));
			this._store.set(obj, val);
		} else if (typeof obj === "object") {
			Object.entries(obj).forEach(([key, value]) => {
				this.triggerListener(key, value, this._store.get(key));
				this._store.set(key, value);
			});
		}
	}

	// 添加监听函数
	on(key, listener) {
		const listenerConfig = {
			handler: listener,
			executed: false,
			pageUrl: this.getPageUrl()
		};

		this.setListener(key, listenerConfig);
	}

	// 设置监听函数
	setListener(key, listener) {
		if (this.hasListener(key)) {
			this.listenerList.get(key).push(listener);
		} else {
			this.listenerList.set(key, [listener]);
		}
	}

	// 检查是否存在监听函数
	hasListener(key) {
		return this.listenerList.has(key);
	}

	// 获取当前页面信息
	getCurrPage() {
		const pageList = getCurrentPages();
		return pageList[pageList.length - 1] || { route: '' };
	}

	// 获取当前页面的URL
	getPageUrl() {
		return this.getCurrPage().route;
	}

	// 触发监听函数
	triggerListener(key, newVal, oldVal) {
		const currPageUrl = this.getPageUrl();
		if (this.hasListener(key)) {
			this.listenerList.get(key).filter(listener => {
				let isFilter = !listener.inPage || currPageUrl === listener.pageUrl;
				return isFilter && !(listener.once && listener.executed);
			}).forEach(listener => {
				listener.executed = true;
				listener.handler(newVal, oldVal);
			});
		}
	}

	// 创建代理以防止直接修改store
	createProxy(store) {
		return new Proxy(store, {
			get: (target, prop) => Reflect.get(target, prop),
			set: () => {
				console.warn('Warning: 请使用set方法操作store');
				return true;
			}
		});
	}
}
